#include "my_lllt.h"
#include "my_uart.h"
#include "sys_param.h"


// #define LLT_LED_EN  1
/***********
 * 
 *Ⅰ.FACE 脸部模式   EMS（中频电流抓感，脸部要抽动）+电穿孔+高周波+全光谱灯珠+红光 LED 660nm+绿灯540nm（14颗）——适用全脸
   Ⅱ.BODY 身体模式   EMS（变压多频的拍打体感）+高周波+全光谱灯珠+红光 LED 660nm+红光660nm（14颗）——适用身体
   Ⅲ.HAIR 头皮模式   EMS（变频变压的抓感体感）+高周波+全光谱灯珠+红光 LED 660nm+红光660nm（8颗）+绿灯540nm（6颗）（红绿是间隔的）——适用头皮
   Ⅳ.MAX+  强力模式   EMS（强力，低压电流敲打感+麻感+抓力波形，多波形变化）+全光谱灯珠+红光 LED 660nm——PS：
 * ****/

#ifdef LLT_LED_EN
//---------------------2024 10 17 check
// 全光谱灯珠+红光 LED 660nm[电极板上的大灯珠18pcs]
#define  LLLT_FULL_SPECTRUM_PORT        (GPIOB)
#define  LLLT_FULL_SPECTRUM_PIN         (GPIO_PIN_11)
#define  FULL_SPECTRUM_LED_ON()         set_pin_high(LLLT_FULL_SPECTRUM_PORT, LLLT_FULL_SPECTRUM_PIN)
#define  FULL_SPECTRUM_LED_OFF()        set_pin_low(LLLT_FULL_SPECTRUM_PORT, LLLT_FULL_SPECTRUM_PIN)

//红绿复合灯珠--共14pcs， 分为2组控制[6pcs + 8pcs] = 14pcs
#define  LLLT_R6_DLED_PORT      (GPIOC)            //(GPIOA)  v1.1 版本呢修正
#define  LLLT_R6_DLED_PIN       (GPIO_PIN_15)      //(GPIO_PIN_11)
#define  DLED_R6_ON()           set_pin_high(LLLT_R6_DLED_PORT, LLLT_R6_DLED_PIN)
#define  DLED_R6_OFF()          set_pin_low(LLLT_R6_DLED_PORT, LLLT_R6_DLED_PIN)

#define  LLLT_G6_DLED_PORT      (GPIOC)         // (GPIOB)  v1.1 版本呢修正
#define  LLLT_G6_DLED_PIN       (GPIO_PIN_14)   // (GPIO_PIN_2)
#define  DLED_G6_ON()           set_pin_high(LLLT_G6_DLED_PORT, LLLT_G6_DLED_PIN)
#define  DLED_G6_OFF()          set_pin_low(LLLT_G6_DLED_PORT, LLLT_G6_DLED_PIN)

//红绿复合灯珠--共14pcs， 分为2组控制[6pcs + 8pcs] = 14pcs
#define  LLLT_R8_DLED_PORT      (GPIOA)         //(GPIOC)  v1.1 版本呢修正
#define  LLLT_R8_DLED_PIN       (GPIO_PIN_11)    //   (GPIO_PIN_14)
#define  DLED_R8_ON()           set_pin_high(LLLT_R8_DLED_PORT, LLLT_R8_DLED_PIN)
#define  DLED_R8_OFF()          set_pin_low(LLLT_R8_DLED_PORT, LLLT_R8_DLED_PIN)

#define  LLLT_G8_DLED_PORT    (GPIOB)       // (GPIOC)
#define  LLLT_G8_DLED_PIN     (GPIO_PIN_2) // (GPIO_PIN_15)
#define  DLED_G8_ON()         set_pin_high(LLLT_G8_DLED_PORT, LLLT_G8_DLED_PIN)
#define  DLED_G8_OFF()        set_pin_low(LLLT_G8_DLED_PORT, LLLT_G8_DLED_PIN)
#else
#define  LLT_EN_PORT    (GPIOB)     
#define  LLT_EN_PIN     (GPIO_PIN_14) 
#define  LLT_ON()       set_pin_high(LLT_EN_PORT, LLT_EN_PIN)
#define  LLT_OFF()      set_pin_low(LLT_EN_PORT, LLT_EN_PIN)
#endif 


static void eye_mode_disp(void);
static void face_mode_disp(void);
static void body_mode_disp(void);
static void hair_mode_disp(void);
static void uart_test_mode_disp(void);
static void aling_mode_disp(void);
static void lift_mode_disp(void);


typedef void(*disp_fun_t)(void);


typedef struct 
{
    WORK_MODE_e mode;
    disp_fun_t disp_func;

    /* data */
}LLLT_DISP_t;


LLLT_DISP_t lllt_disp_item[] = {
    {MAX_MODE, eye_mode_disp},
    {FACE_MODE, face_mode_disp},
    {BODY_MODE, body_mode_disp},
    {HAIR_MODE, hair_mode_disp},
    {UART_TEST_MODE, uart_test_mode_disp},
    {ALIGN_MODE, uart_test_mode_disp},
    {LIFT_MODE, uart_test_mode_disp},
};

/*************
1.Ⅰ.EYE  眼部模式  ：（20颗）vcsel红灯660nm+近红外1064nm + （20颗）vcsel红灯660nm（暂不确定）
* **/
static void eye_mode_disp(void)
{
    // FULL_SPECTRUM_LED_ON();
    // DLED_R6_OFF();
    // DLED_G6_OFF();
    // DLED_R8_OFF();
    // DLED_G8_OFF();
}
/*************
2. Ⅱ.FACE 脸部模式：（20颗）红灯660nm+近红外1064nm+（20颗）绿光540nm
        EMS（中频电流抓感，脸部要抽动）+电穿孔+高周波+全光谱灯珠+红光 LED 660nm+绿灯540nm（14颗）——适用全脸
* **/
static void face_mode_disp(void)
{
    // FULL_SPECTRUM_LED_ON();
    // DLED_R6_OFF();
    // DLED_G6_ON();
    // DLED_R8_OFF();
    // DLED_G8_ON();
}

/*************
3. Ⅲ.BODY 身体模式：
* **/
static void body_mode_disp(void)
{
    // FULL_SPECTRUM_LED_ON();
    // DLED_G6_OFF();
    // DLED_R6_ON();
    // DLED_G8_OFF();
    // DLED_R8_ON();
}
/*************
4.  Ⅳ.HAIR 头皮模式 ：全光谱灯珠+红光 LED 660nm+红光660nm（8颗）+绿灯540nm（6颗）（红绿是间隔的）
* **/
static void hair_mode_disp(void)
{
    // FULL_SPECTRUM_LED_ON();
    // DLED_R6_OFF();
    // DLED_G6_ON();
    // DLED_G8_OFF();
    // DLED_R8_ON();
}
/*************
5. 测试模式, 假设10ms进入一次
***/
static void uart_test_mode_disp(void)
{
    // static int flicker_cnt = 0;
    // static int on_off_flag;

    // flicker_cnt ++;
    // if(on_off_flag){
    //     if(flicker_cnt > 50){
    //         flicker_cnt = 0;
    //         on_off_flag = 0;
    //         FULL_SPECTRUM_LED_ON();
         
    //     }
    // }
    // else{
    //    if(flicker_cnt > 50){
    //         flicker_cnt = 0;
    //         on_off_flag = 1;
    //         FULL_SPECTRUM_LED_OFF();
    //     }
    // }
}
/*************
6. 老化测试
* **/
static void aling_mode_disp(void)
{
    uart_test_mode_disp();
}
/*************
7. 寿命测试
* **/
static void lift_mode_disp(void)
{
    uart_test_mode_disp();
}

/***************
 * 在系统 10ms中调用
 * 
*/
void my_lllt_disp(void)
{
    switch(get_sys_state())
    {
        case SLEEP_STA:
        case CHARGE_STA:
        case SYS_IDLE_STA:
        case CHARGE_FINISH_STA:{
            my_lllt_off();
            break;
        }
        case NORMAL_WORK_STA:{
            if(get_sys_hf_level()&&(ON_LINE_STA == get_sys_load_state())){
                my_lllt_on();
            }
            else{
                my_lllt_off();
            }
            break;
        }
        default:{
            my_lllt_off();
            break;
        }
    }
}

void my_lllt_on(void)
{
    // set_pin_high(LLLT_GREEN_PORT, LLLT_GREEN_PIN);
    // set_pin_high(LLLT_RED1_PORT, LLLT_RED1_PIN);
    // set_pin_high(LLLT_RED2_PORT, LLLT_RED2_PIN);
    LLT_ON();
}

void my_lllt_off(void)
{
    // set_pin_low(LLLT_GREEN_PORT, LLLT_GREEN_PIN);
    // set_pin_low(LLLT_RED1_PORT, LLLT_RED1_PIN);
    // set_pin_low(LLLT_RED2_PORT, LLLT_RED2_PIN);
    LLT_OFF();
}


void my_lllt_init(void)
{
	// printf("\n\r LLLT_RED2_PIN:%d \n\r", LLLT_FULL_SPECTRUM_PIN);
	
    // gpio_output_cfg(LLLT_FULL_SPECTRUM_PORT, LLLT_FULL_SPECTRUM_PIN);
    // gpio_output_cfg(LLLT_R6_DLED_PORT, LLLT_R6_DLED_PIN);
    // gpio_output_cfg(LLLT_G6_DLED_PORT, LLLT_G6_DLED_PIN);

    // gpio_output_cfg(LLLT_R8_DLED_PORT, LLLT_R8_DLED_PIN);
    // gpio_output_cfg(LLLT_G8_DLED_PORT, LLLT_G8_DLED_PIN);

    gpio_output_cfg(LLT_EN_PORT, LLT_EN_PIN);
    my_lllt_off();
}
